<?php
namespace app\service\Protocol;

/**
 * 协议工厂类
 * 根据厂商类型创建对应的协议适配器
 */
class ProtocolFactory
{
    /**
     * 已注册的协议适配器
     * @var array
     */
    private static $protocols = [];

    /**
     * 默认协议
     * @var string
     */
    private static $defaultProtocol = 'vendor1';

    /**
     * 初始化工厂（注册所有可用的协议）
     */
    public static function init(): void
    {
        if (empty(self::$protocols)) {
            self::register('vendor1', Vendor1Protocol::class);
            self::register('vendor2', Vendor2Protocol::class);
            self::register('mqttx', Vendor2Protocol::class); // MQTTX是Vendor2的别名
        }
    }

    /**
     * 注册协议适配器
     *
     * @param string $name 协议名称
     * @param string $className 协议类名
     */
    public static function register(string $name, string $className): void
    {
        self::$protocols[$name] = $className;
    }

    /**
     * 创建协议适配器
     *
     * @param string $vendor 厂商名称
     * @return ProtocolInterface 协议适配器实例
     * @throws \Exception
     */
    public static function create(string $vendor): ProtocolInterface
    {
        self::init();

        $vendor = strtolower(trim($vendor));

        if (!isset(self::$protocols[$vendor])) {
            throw new \Exception("不支持的协议: {$vendor}");
        }

        $className = self::$protocols[$vendor];

        if (!class_exists($className)) {
            throw new \Exception("协议类不存在: {$className}");
        }

        $instance = new $className();

        if (!($instance instanceof ProtocolInterface)) {
            throw new \Exception("协议类必须实现ProtocolInterface: {$className}");
        }

        return $instance;
    }

    /**
     * 获取所有已注册的协议
     * 
     * @return array 协议列表
     */
    public static function getAvailableProtocols(): array
    {
        self::init();
        return array_keys(self::$protocols);
    }

    /**
     * 设置默认协议
     *
     * @param string $vendor 协议名称
     */
    public static function setDefault(string $vendor): void
    {
        self::init();
        if (isset(self::$protocols[$vendor])) {
            self::$defaultProtocol = $vendor;
        }
    }

    /**
     * 获取默认协议
     * 
     * @return ProtocolInterface 默认协议适配器
     */
    public static function getDefault(): ProtocolInterface
    {
        return self::create(self::$defaultProtocol);
    }
}

